"""
日志配置模块
可以单独导入使用，或者根据环境变量调整日志级别
"""
import logging
import sys
import os
from pathlib import Path
from datetime import datetime


def setup_logger(
    log_level: str = "INFO",
    log_dir: str = "logs",
    log_to_file: bool = True,
    log_to_console: bool = True
) -> logging.Logger:
    """
    配置日志系统
    
    Args:
        log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        log_dir: 日志文件目录
        log_to_file: 是否输出到文件
        log_to_console: 是否输出到控制台
    
    Returns:
        配置好的 logger 实例
    """
    # 创建 logs 目录
    log_path = Path(log_dir)
    log_path.mkdir(exist_ok=True)
    
    # 日志文件名（按日期）
    log_filename = log_path / f"app_{datetime.now().strftime('%Y%m%d')}.log"
    
    # 配置日志格式 - 包含脚本名、函数名、行号
    log_format = "%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(funcName)s:%(lineno)d] - %(message)s"
    date_format = "%Y-%m-%d %H:%M:%S"
    
    # 转换日志级别字符串为 logging 常量
    numeric_level = getattr(logging, log_level.upper(), logging.INFO)
    
    # 配置根 logger
    logger = logging.getLogger()
    logger.setLevel(numeric_level)
    
    # 清除已有的 handlers（避免重复添加）
    logger.handlers.clear()
    
    # 文件 handler - 记录所有级别的日志
    if log_to_file:
        file_handler = logging.FileHandler(
            log_filename,
            encoding='utf-8',
            mode='a'
        )
        file_handler.setLevel(logging.DEBUG)  # 文件记录所有级别
        file_formatter = logging.Formatter(log_format, date_format)
        file_handler.setFormatter(file_formatter)
        logger.addHandler(file_handler)
    
    # 控制台 handler - 根据配置的级别显示
    if log_to_console:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.setLevel(numeric_level)
        console_formatter = logging.Formatter(log_format, date_format)
        console_handler.setFormatter(console_formatter)
        logger.addHandler(console_handler)
    
    # 设置第三方库的日志级别
    logging.getLogger("uvicorn").setLevel(logging.INFO)
    logging.getLogger("uvicorn.access").setLevel(logging.WARNING)
    logging.getLogger("fastapi").setLevel(logging.INFO)
    
    return logger


def get_logger(name: str) -> logging.Logger:
    """
    获取指定名称的 logger
    
    Args:
        name: logger 名称，通常是模块名 __name__
    
    Returns:
        logger 实例
    """
    return logging.getLogger(name)


# 从环境变量读取配置
def setup_logger_from_env() -> logging.Logger:
    """
    从环境变量读取日志配置并设置 logger
    
    环境变量:
        LOG_LEVEL: 日志级别 (默认: INFO)
        LOG_DIR: 日志目录 (默认: logs)
        LOG_TO_FILE: 是否输出到文件 (默认: true)
        LOG_TO_CONSOLE: 是否输出到控制台 (默认: true)
    """
    log_level = os.getenv("LOG_LEVEL", "INFO")
    log_dir = os.getenv("LOG_DIR", "logs")
    log_to_file = os.getenv("LOG_TO_FILE", "true").lower() == "true"
    log_to_console = os.getenv("LOG_TO_CONSOLE", "true").lower() == "true"
    
    return setup_logger(
        log_level=log_level,
        log_dir=log_dir,
        log_to_file=log_to_file,
        log_to_console=log_to_console
    )

setup_logger()
